package com.geekhole.demo.user.application.v2.service.base;

import com.geekhole.demo.user.domain.Agg;
import com.geekhole.demo.user.domain.DomainServiceContext;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.repository.CrudRepository;

public abstract class AbstractUpdateService<AGG extends Agg, CONTEXT extends DomainServiceContext>
    extends AbstractDomainService<AGG, CONTEXT>{

    public AbstractUpdateService(CrudRepository<AGG, ?> repository,
                                    ApplicationEventPublisher eventPublisher) {
        super(repository, eventPublisher);
    }

    /**
     * 重写父类方法，进行扩展
     * @param context
     * @return
     */
    @Override
    protected AGG doHandle(CONTEXT context) {
        // 1. 加载聚合根
        AGG agg = loadAgg(context);

        // 2. 验证聚合根
        if (agg == null){
            notFound(context);
        }

        // 3. 调用聚合根方法
        update(agg, context);

        return agg;
    }

    /**
     * 子类扩展点，加载要操作的聚合
     * @param context
     * @return
     */
    protected abstract AGG loadAgg(CONTEXT context);

    /**
     * 子类扩展点，当聚合丢失时进行回调
     * @param context
     */
    protected abstract void notFound(CONTEXT context);


    /**
     * 子类扩展点，调用 聚合上的业务方法
     * @param agg
     * @param context
     */
    protected abstract void update(AGG agg, CONTEXT context);
}
